import random
import re

from flask import request, abort, current_app, make_response, json

from info import redis_store
from info.utils.response_code import *
from info.utils.yuntongxun import sms
from . import passport_blueprint
from info.utils.captcha.captcha import captcha
from info.constants import IMAGE_CODE_REDIS_EXPIRES

@passport_blueprint.route("/image_code")
def passport_def():
    """判断验证码
    2.判断是否有参数，如果没有报403错误
    3.如果有，调用生成验证码图片函数，接受name，图片的内容及图片
    4.将生成的图片内容与参数放在redis_store当中
    因为可能有多个浏览器同时访问，所以每一个浏览器需要带上自己的标识符，及参数"""
    imageCodeId = request.args.get("imageCodeId")
    if not imageCodeId:
        return abort(403)
    name, test, image = captcha.generate_captcha()
    try:
        redis_store.set(imageCodeId,test,ex=IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.degug(e)
        abort(500)
    # 因为有些浏览器可能会出现Context-Type类型错误而导致图片不能加载
    response = make_response(image)
    response.headers["Content-Type"] = "image/jpg"
    return image

@passport_blueprint.route("/sms_code",methods=["POST"])
def sms_code():
    """获取验证码试图函数
    1.先判断3个参数是否为空
    2.判断手机号是否正确
    3.取出redis中的数据
    3.1 查看验证码是否存在，不存在则返回验证码失效
    3.2 判断验证码是否正确，(忽略大小写)
    4.发送短信内容
    5.在redis中生成新的reids信息，里边存放着验证码，并设置时间
    发送成功
    """
    # params_dict = json.loads(request.data)
    params_dict = json.loads(request.data)
    mobile = params_dict["mobile"]
    imageCode = params_dict["imageCode"]
    imageCodeId = params_dict["imageCodeId"]
    # 先判断3个参数是否为空
    if not all([mobile,imageCode,imageCodeId]):
        return json.jsonify(errno=RET.NODATA,errmsg=error_map[RET.NODATA])
    # 判断手机号是否正确
    ret = re.match(r"1[35678]\d{9}",mobile)
    if not ret:
        return json.jsonify(errno=RET.PARAMERR,errmsg=error_map[RET.PARAMERR])
    # 先查看验证码是否存在
    try:
        redis_imageCodeId = redis_store.get(imageCodeId)
    except Exception as e:
        current_app.logger.error(e)
        return json.jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    # 判断诗句是否为空
    if not redis_imageCodeId:
        return json.jsonify(errno=RET.NODATA, errmsg="验证码过期")
    # 判断验证码是否正确
    redis_imageCodeId = str(redis_imageCodeId,encoding="utf-8")
    if redis_imageCodeId.upper() != imageCode.upper():
        return json.jsonify(errno=RET.DATAERR, errmsg=error_map[RET.DATAERR])
    # 生成短信
    send_msg_content = "%06d"%random.randint(0,999999)
    try:
        sms.CCP().send_template_sms('18629188999', [send_msg_content, IMAGE_CODE_REDIS_EXPIRES/60], 1)
    except Exception as e:
        return json.jsonify(errno=RET.THIRDERR, errmsg="发送验证码失败")
    # 在redis中生成新的reids信息，里边存放着验证码，并设置时间
    try:
        redis_store.set(imageCode + imageCodeId, send_msg_content, ex=IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return json.jsonify(errno=RET.DBERR, errmsg="数据库存储失败")

    return json.jsonify(errno=RET.OK,errmsg=error_map[RET.OK])